package com.graduation_design.modules.system.shiro;

import cn.hutool.core.map.MapUtil;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition;
import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.apache.shiro.mgt.SecurityManager;

@Configuration
public class ShiroConfig {
    // 主要配置一些自定义的权限认证器Realm，还有自定义的过滤器。

    // 定义了Realm，realm的作用主要就是完成用户的身份认证和权限认证。
    // 所以我们重写了AccountRealm以完成系统的认证功能。
    @Bean
    Realm realm(){
        return new AccountRealm();
    }

    // 配置了所有访问链接需要通过JwtFilter拦截器，然后判断请求头中是否含有jwt的信息，有就登录，没有就提示请先登录。
    // 另外Controller中的shiro注解进行再次拦截，比如@RequiresRoles("admin")，这样控制权限访问。
    // 然后app开头app端api的访问链接是直接跳过的，app端的身份认证是另外拦截器完成的。
    @Bean
    ShiroFilterChainDefinition shiroFilterChainDefinition(){
        DefaultShiroFilterChainDefinition definition = new DefaultShiroFilterChainDefinition();
        definition.addPathDefinition("/app/**", "anon");
        definition.addPathDefinition("/sys/login", "anon");
        definition.addPathDefinition("/**", "jwt");

        return definition;
    }

    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager,
                                                         ShiroFilterChainDefinition shiroFilterChainDefinition) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        shiroFilterFactoryBean.setFilters(MapUtil.of("jwt", new JwtFilter()));
        shiroFilterFactoryBean.setFilterChainDefinitionMap(shiroFilterChainDefinition.getFilterChainMap());

        return shiroFilterFactoryBean;
    }

}
